For procedural notes, see https://docs.google.com/document/d/19D9PL1GHnvecNTUE8VE_fwaeTmXNUuWdSwo6NsOBqlo/edit

The script below (also saved separately as sema_fitting_script.R) loads the proteome discoverer file, wrangles the data into a fotmat for input to the TPP package, and performs the curve fitting. Individual output plots can be viewed in the exported_plots folder. This code chunk does not have to be run again.

## Alice Herneisen
## Last updated: 26 February 2023
## Perform thermal profiling analysis, generate melting curves, save output files

# packages
library(tidyverse)
library(TPP)
library(plotly)

## set directories: input files (kept in inputdata folder)
setwd("~/Dropbox (MIT)/LOURIDO/COLLABORATIONS/Aarti_Krishnan/inputfiles")
file1 = "Sema_TPP_analysis_1_master_proteins_only_Proteins.txt"

## Load the protein data from Proteome Discoverer - "raw" data frames
DF1 <- read.table(file1, 
                  header = T, 
                  fill = T, 
                  stringsAsFactors = F)

## Keep most relevant columns of Proteome Discoverer data frame and add columns of 1's
## corresponding to the lowest temperature
## columns to keep from Proteome Discoverer 
DMSO_1 <- DF1 %>% dplyr::select(Description, Accession, Number.of.PSMs, Number.of.Unique.Peptides, 
                             "Abundance.Ratio.44.DMSO..40.DMSO", 
                             "Abundance.Ratio.47.DMSO..40.DMSO",
                             "Abundance.Ratio.51.DMSO..40.DMSO",
                             "Abundance.Ratio.55.DMSO..40.DMSO",
                             "Abundance.Ratio.58.DMSO..40.DMSO",
                             "Abundance.Ratio.60.DMSO..40.DMSO",
                             "Abundance.Ratio.63.DMSO..40.DMSO",
                             "Abundance.Ratio.66.DMSO..40.DMSO",
                             "Abundance.Ratio.70.DMSO..40.DMSO") %>% 
  rename(gene_name = Accession) %>%
  rename(gene_description = Description) %>% 
  add_column(Abundance_Ratio_1 = as.numeric(1), .before = 5)

SEMA_1 <- DF1 %>% dplyr::select(Description, Accession, Number.of.PSMs, Number.of.Unique.Peptides, 
                             "Abundance.Ratio.44.sema..40.sema", 
                             "Abundance.Ratio.47.sema..40.sema",
                             "Abundance.Ratio.51.sema..40.sema",
                             "Abundance.Ratio.55.sema..40.sema",
                             "Abundance.Ratio.58.sema..40.sema",
                             "Abundance.Ratio.60.sema..40.sema",
                             "Abundance.Ratio.63.sema..40.sema",
                             "Abundance.Ratio.66.sema..40.sema",
                             "Abundance.Ratio.70.sema..40.sema") %>% 
  rename(gene_name = Accession) %>%
  rename(gene_description = Description) %>% 
  add_column(Abundance_Ratio_1 = as.numeric(1), .before = 5)


## Create list of TMT labels for renaming the columns (see below)

TMTrange <- c("126", "127N", "127C", "128N", "128C", "129N", "129C", "130N", "130C","131")

## create data frames corresponding to input relative frequencies of the vehicle and treatment
## temperature range lysate experiments. These data frames are input to the TPP package.


names(SEMA_1)[5:14] <- paste("rel_fc_", TMTrange, sep="")
names(DMSO_1)[5:14] <- paste("rel_fc_", TMTrange, sep="")


####################  CURVE FITTING ####################

exptconfig <- read.csv("Ecoli_SEMA_config_table.csv", 
                       header = T, 
                       stringsAsFactors = F, 
                       check.names=F)
dflist <- list(DMSO_1, 
               SEMA_1)
names(dflist) <- c("DMSO_1", "SEMA_1")

resultPath <- "~/Dropbox (MIT)/LOURIDO/COLLABORATIONS/Aarti_Krishnan/exported_plots"
fits <- analyzeTPPTR(configTable = exptconfig,
                     data = dflist, 
                     resultPath = resultPath, 
                     normalize = TRUE, 
                     nCores = 1, 
                     verbose = TRUE, 
                     xlsxExport = FALSE)
                          
                        
## save the output data frames
write.table(fits, file = "DMSO_SEMA_tr_fits_R1.txt", 
                                      quote = FALSE, 
                                      sep = "\t",
                                      row.names = FALSE)

Plots

The TPP package fits curves using a sigmoidal and nonparametric analysis. I like to view the sigmoidal melting curves as an xy scatter, highlighting points that have a large differential in Tm under one condition.

I’ve used plotly to create an interactive plot.

p <- ggplot(data = fits, aes(x = meltPoint_DMSO_1, 
                             y = meltPoint_SEMA_1,  
                             color = -log10(pVal_adj_SEMA_1_vs_DMSO_1),
                             text = paste0(Protein_ID, "\n",
                                           gene_description_DMSO_1))) +
                            geom_point() +
                            theme(aspect.ratio = 1)
p

ggplotly(p, tooltip = c("text"))
Aspect ratios aren't yet implemented, but you can manually set a suitable height/widthAspect ratios aren't yet implemented, but you can manually set a suitable height/width
NA

The NPARC can be summarized as a rank-ordered plot.

    
p <- ggplot(data = fits, aes(x = rank(p_adj_NPARC, ties.method = "first"), 
                             y = -log10(p_adj_NPARC),
                             text = paste0(Protein_ID, "\n",
                                           gene_description_DMSO_1))) +
  geom_point(color = "snow3") +
  geom_hline(yintercept = -log10(0.01)) +
  theme(aspect.ratio = 1)
p

ggplotly(p, tooltip = c("text"))                      
Aspect ratios aren't yet implemented, but you can manually set a suitable height/widthAspect ratios aren't yet implemented, but you can manually set a suitable height/width
LS0tCnRpdGxlOiAic2VtYSB0ZW1wZXJhdHVyZSByYW5nZSBDRVRTQSByZXBsaWNhdGUgMSAtLSBhbmFseXNpcyBub3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKRm9yIHByb2NlZHVyYWwgbm90ZXMsIHNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzE5RDlQTDFHSG52ZWNOVFVFOFZFX2Z3YWVUbVhOVXVXZFN3bzZOc09CcWxvL2VkaXQKCgpUaGUgc2NyaXB0IGJlbG93IChhbHNvIHNhdmVkIHNlcGFyYXRlbHkgYXMgc2VtYV9maXR0aW5nX3NjcmlwdC5SKSBsb2FkcyB0aGUgcHJvdGVvbWUgZGlzY292ZXJlciBmaWxlLCB3cmFuZ2xlcyB0aGUgZGF0YSBpbnRvIGEgZm90bWF0IGZvciBpbnB1dCB0byB0aGUgVFBQIHBhY2thZ2UsIGFuZCBwZXJmb3JtcyB0aGUgY3VydmUgZml0dGluZy4gSW5kaXZpZHVhbCBvdXRwdXQgcGxvdHMgY2FuIGJlIHZpZXdlZCBpbiB0aGUgZXhwb3J0ZWRfcGxvdHMgZm9sZGVyLiBUaGlzIGNvZGUgY2h1bmsgZG9lcyBub3QgaGF2ZSB0byBiZSBydW4gYWdhaW4uCmBgYHtyfQojIyBBbGljZSBIZXJuZWlzZW4KIyMgTGFzdCB1cGRhdGVkOiAyNiBGZWJydWFyeSAyMDIzCiMjIFBlcmZvcm0gdGhlcm1hbCBwcm9maWxpbmcgYW5hbHlzaXMsIGdlbmVyYXRlIG1lbHRpbmcgY3VydmVzLCBzYXZlIG91dHB1dCBmaWxlcwoKIyBwYWNrYWdlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShUUFApCmxpYnJhcnkocGxvdGx5KQoKIyMgc2V0IGRpcmVjdG9yaWVzOiBpbnB1dCBmaWxlcyAoa2VwdCBpbiBpbnB1dGRhdGEgZm9sZGVyKQpzZXR3ZCgifi9Ecm9wYm94IChNSVQpL0xPVVJJRE8vQ09MTEFCT1JBVElPTlMvQWFydGlfS3Jpc2huYW4vaW5wdXRmaWxlcyIpCmZpbGUxID0gIlNlbWFfVFBQX2FuYWx5c2lzXzFfbWFzdGVyX3Byb3RlaW5zX29ubHlfUHJvdGVpbnMudHh0IgoKIyMgTG9hZCB0aGUgcHJvdGVpbiBkYXRhIGZyb20gUHJvdGVvbWUgRGlzY292ZXJlciAtICJyYXciIGRhdGEgZnJhbWVzCkRGMSA8LSByZWFkLnRhYmxlKGZpbGUxLCAKICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVCwgCiAgICAgICAgICAgICAgICAgIGZpbGwgPSBULCAKICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCgojIyBLZWVwIG1vc3QgcmVsZXZhbnQgY29sdW1ucyBvZiBQcm90ZW9tZSBEaXNjb3ZlcmVyIGRhdGEgZnJhbWUgYW5kIGFkZCBjb2x1bW5zIG9mIDEncwojIyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlc3QgdGVtcGVyYXR1cmUKIyMgY29sdW1ucyB0byBrZWVwIGZyb20gUHJvdGVvbWUgRGlzY292ZXJlciAKRE1TT18xIDwtIERGMSAlPiUgZHBseXI6OnNlbGVjdChEZXNjcmlwdGlvbiwgQWNjZXNzaW9uLCBOdW1iZXIub2YuUFNNcywgTnVtYmVyLm9mLlVuaXF1ZS5QZXB0aWRlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby40NC5ETVNPLi40MC5ETVNPIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby40Ny5ETVNPLi40MC5ETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjUxLkRNU08uLjQwLkRNU08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNTUuRE1TTy4uNDAuRE1TTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby41OC5ETVNPLi40MC5ETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjYwLkRNU08uLjQwLkRNU08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNjMuRE1TTy4uNDAuRE1TTyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby42Ni5ETVNPLi40MC5ETVNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjcwLkRNU08uLjQwLkRNU08iKSAlPiUgCiAgcmVuYW1lKGdlbmVfbmFtZSA9IEFjY2Vzc2lvbikgJT4lCiAgcmVuYW1lKGdlbmVfZGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbikgJT4lIAogIGFkZF9jb2x1bW4oQWJ1bmRhbmNlX1JhdGlvXzEgPSBhcy5udW1lcmljKDEpLCAuYmVmb3JlID0gNSkKClNFTUFfMSA8LSBERjEgJT4lIGRwbHlyOjpzZWxlY3QoRGVzY3JpcHRpb24sIEFjY2Vzc2lvbiwgTnVtYmVyLm9mLlBTTXMsIE51bWJlci5vZi5VbmlxdWUuUGVwdGlkZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNDQuc2VtYS4uNDAuc2VtYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNDcuc2VtYS4uNDAuc2VtYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby41MS5zZW1hLi40MC5zZW1hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjU1LnNlbWEuLjQwLnNlbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNTguc2VtYS4uNDAuc2VtYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby42MC5zZW1hLi40MC5zZW1hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWJ1bmRhbmNlLlJhdGlvLjYzLnNlbWEuLjQwLnNlbWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBYnVuZGFuY2UuUmF0aW8uNjYuc2VtYS4uNDAuc2VtYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFidW5kYW5jZS5SYXRpby43MC5zZW1hLi40MC5zZW1hIikgJT4lIAogIHJlbmFtZShnZW5lX25hbWUgPSBBY2Nlc3Npb24pICU+JQogIHJlbmFtZShnZW5lX2Rlc2NyaXB0aW9uID0gRGVzY3JpcHRpb24pICU+JSAKICBhZGRfY29sdW1uKEFidW5kYW5jZV9SYXRpb18xID0gYXMubnVtZXJpYygxKSwgLmJlZm9yZSA9IDUpCgoKIyMgQ3JlYXRlIGxpc3Qgb2YgVE1UIGxhYmVscyBmb3IgcmVuYW1pbmcgdGhlIGNvbHVtbnMgKHNlZSBiZWxvdykKClRNVHJhbmdlIDwtIGMoIjEyNiIsICIxMjdOIiwgIjEyN0MiLCAiMTI4TiIsICIxMjhDIiwgIjEyOU4iLCAiMTI5QyIsICIxMzBOIiwgIjEzMEMiLCIxMzEiKQoKIyMgY3JlYXRlIGRhdGEgZnJhbWVzIGNvcnJlc3BvbmRpbmcgdG8gaW5wdXQgcmVsYXRpdmUgZnJlcXVlbmNpZXMgb2YgdGhlIHZlaGljbGUgYW5kIHRyZWF0bWVudAojIyB0ZW1wZXJhdHVyZSByYW5nZSBseXNhdGUgZXhwZXJpbWVudHMuIFRoZXNlIGRhdGEgZnJhbWVzIGFyZSBpbnB1dCB0byB0aGUgVFBQIHBhY2thZ2UuCgoKbmFtZXMoU0VNQV8xKVs1OjE0XSA8LSBwYXN0ZSgicmVsX2ZjXyIsIFRNVHJhbmdlLCBzZXA9IiIpCm5hbWVzKERNU09fMSlbNToxNF0gPC0gcGFzdGUoInJlbF9mY18iLCBUTVRyYW5nZSwgc2VwPSIiKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjICBDVVJWRSBGSVRUSU5HICMjIyMjIyMjIyMjIyMjIyMjIyMjCgpleHB0Y29uZmlnIDwtIHJlYWQuY3N2KCJFY29saV9TRU1BX2NvbmZpZ190YWJsZS5jc3YiLCAKICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBULCAKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgY2hlY2submFtZXM9RikKZGZsaXN0IDwtIGxpc3QoRE1TT18xLCAKICAgICAgICAgICAgICAgU0VNQV8xKQpuYW1lcyhkZmxpc3QpIDwtIGMoIkRNU09fMSIsICJTRU1BXzEiKQoKcmVzdWx0UGF0aCA8LSAifi9Ecm9wYm94IChNSVQpL0xPVVJJRE8vQ09MTEFCT1JBVElPTlMvQWFydGlfS3Jpc2huYW4vZXhwb3J0ZWRfcGxvdHMiCmZpdHMgPC0gYW5hbHl6ZVRQUFRSKGNvbmZpZ1RhYmxlID0gZXhwdGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmbGlzdCwgCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFBhdGggPSByZXN1bHRQYXRoLCAKICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIG5Db3JlcyA9IDEsIAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIHhsc3hFeHBvcnQgPSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiMjIHNhdmUgdGhlIG91dHB1dCBkYXRhIGZyYW1lcwp3cml0ZS50YWJsZShmaXRzLCBmaWxlID0gIkRNU09fU0VNQV90cl9maXRzX1IxLnR4dCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJcdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKIyMgUGxvdHMKClRoZSBUUFAgcGFja2FnZSBmaXRzIGN1cnZlcyB1c2luZyBhIHNpZ21vaWRhbCBhbmQgbm9ucGFyYW1ldHJpYyBhbmFseXNpcy4gSSBsaWtlIHRvIHZpZXcgdGhlIHNpZ21vaWRhbCBtZWx0aW5nIGN1cnZlcyBhcyBhbiB4eSBzY2F0dGVyLCBoaWdobGlnaHRpbmcgcG9pbnRzIHRoYXQgaGF2ZSBhIGxhcmdlIGRpZmZlcmVudGlhbCBpbiBUbSB1bmRlciBvbmUgY29uZGl0aW9uLiAKCkkndmUgdXNlZCBwbG90bHkgdG8gY3JlYXRlIGFuIGludGVyYWN0aXZlIHBsb3QuCmBgYHtyfQpwIDwtIGdncGxvdChkYXRhID0gZml0cywgYWVzKHggPSBtZWx0UG9pbnRfRE1TT18xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbWVsdFBvaW50X1NFTUFfMSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gLWxvZzEwKHBWYWxfYWRqX1NFTUFfMV92c19ETVNPXzEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoUHJvdGVpbl9JRCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfZGVzY3JpcHRpb25fRE1TT18xKSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShhc3BlY3QucmF0aW8gPSAxKQpwCmdncGxvdGx5KHAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKVGhlIE5QQVJDIGNhbiBiZSBzdW1tYXJpemVkIGFzIGEgcmFuay1vcmRlcmVkIHBsb3QuCmBgYHtyfQogICAgCnAgPC0gZ2dwbG90KGRhdGEgPSBmaXRzLCBhZXMoeCA9IHJhbmsocF9hZGpfTlBBUkMsIHRpZXMubWV0aG9kID0gImZpcnN0IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAtbG9nMTAocF9hZGpfTlBBUkMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoUHJvdGVpbl9JRCwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfZGVzY3JpcHRpb25fRE1TT18xKSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gInNub3czIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1sb2cxMCgwLjAxKSkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpCnAKZ2dwbG90bHkocCwgdG9vbHRpcCA9IGMoInRleHQiKSkgICAgICAgICAgICAgICAgICAgICAgCgpgYGAKCg==